Skip to content

[REVERT] Workspace, Role 통합 롤백#37

Merged
Sangyoon98 merged 2 commits intomainfrom
revert/workspace
Nov 11, 2025
Merged

[REVERT] Workspace, Role 통합 롤백#37
Sangyoon98 merged 2 commits intomainfrom
revert/workspace

Conversation

@Sangyoon98
Copy link
Member

@Sangyoon98 Sangyoon98 commented Nov 11, 2025

📝 Summary

Workspace, Role 통합 롤백

🙏 Question & PR point

📬 Reference

Summary by CodeRabbit

  • 새로운 기능

    • 사용자 워크스페이스 정보 저장 및 관리 기능 추가
    • 인증/프로필/직원 관리에서 워크스페이스 기반 흐름 통합
  • 버그 수정 / 동작 변경

    • 로그아웃 시 로컬 인증 정보가 명확히 초기화되도록 변경
  • 버전

    • 앱 버전을 1.0.8로 업데이트

@coderabbitai
Copy link

coderabbitai bot commented Nov 11, 2025

Walkthrough

이 PR은 프로젝트 전반에서 role 필드를 workspace로 대체하고, 인증 저장소(AuthPreferences)에 암호화된 workspace 저장/복구를 추가했습니다. 앱 버전은 versionCode 7→9, versionName "1.0.6"→"1.0.8"으로 업데이트되었습니다.

Changes

Cohort / File(s) Summary
버전 업데이트
app/build.gradle.kts
versionCode 7→9, versionName "1.0.6"→"1.0.8"
인증 선호도 저장소
app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt
USER_WORKSPACE 키 추가, 암호화된 workspace 저장/로드 추가; getStoredUser/saveUser가 workspace를 암호화/복호화해서 처리하고 User 생성 시 workspace 포함
인증 요청 DTO
app/src/main/java/com/sampoom/android/feature/auth/data/remote/dto/LoginRequestDto.kt, app/src/main/java/com/sampoom/android/feature/auth/data/remote/dto/SignUpRequestDto.kt
DTO 필드 roleworkspace로 이름 변경 (직렬화/요청 페이로드 변경)
인증 매퍼
app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt
LoginResponseDto.toModel에서 role 제거, User 생성자에 workspace 인자 추가(빈 문자열로 초기화)
인증 저장소/인터페이스/유스케이스/뷰모델
app/src/main/java/com/sampoom/android/feature/auth/**
signUp/signIn 관련 시그니처 및 호출에서 roleworkspace로 변경(인터페이스·구현·usecase·ui 전반) 및 signOut에서 preferences.clear() 호출 시점 변경
사용자 도메인 모델
app/src/main/java/com/sampoom/android/feature/user/domain/model/User.kt, .../Employee.kt
role 필드 제거, workspace: String 필드 추가(생성자 변경)
사용자 원격 DTO 및 매퍼
app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/*, app/src/main/java/com/sampoom/android/feature/user/data/mapper/UserMappers.kt
여러 DTO에 workspace 추가/role 제거; 모든 toModel 변환에서 workspace 매핑 적용(일부는 빈 문자열 기본값)
사용자 API
app/src/main/java/com/sampoom/android/feature/user/data/remote/api/UserApi.kt
@Query("role")@Query("workspace"), 관련 파라미터명 role→workspace로 변경 (getProfile, editEmployee, getEmployeeList, updateEmployeeStatus)
사용자 저장소/인터페이스/유스케이스
app/src/main/java/com/sampoom/android/feature/user/**
getProfile/editEmployee/updateEmployeeStatus 시그니처 및 호출에서 role→workspace로 변경; 리포지토리에서 API 호출과 반환 매핑에 workspace 반영

Sequence Diagram(s)

sequenceDiagram
    participant UI as UI / ViewModel
    participant Repo as Repository
    participant Pref as AuthPreferences
    participant Crypto as CryptoManager
    participant Store as DataStore

    rect rgb(240,248,255)
    UI->>Repo: saveUser(user)
    Repo->>Pref: saveUser(user)
    Pref->>Crypto: encrypt(user fields incl. workspace)
    Crypto-->>Pref: encrypted fields
    Pref->>Store: write encrypted prefs (token, id, workspace...)
    end

    rect rgb(255,250,240)
    UI->>Repo: getStoredUser()
    Repo->>Pref: getStoredUser()
    Pref->>Store: read encrypted prefs
    Store-->>Pref: encrypted values
    Pref->>Crypto: decrypt(values incl. workspace)
    Crypto-->>Pref: decrypted fields
    Pref-->>Repo: User(...)
    Repo-->>UI: User
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

특히 검토가 필요한 부분:

  • AuthPreferences.kt: 암호화/복호화 흐름이 기존 데이터와 호환되는지, null/예외 처리 적절성
  • User/Employee 모델 변경: 직렬화/DTO 매핑과 생성자 변화로 인한 영향 범위
  • UserApi @Query 키 변경: 백엔드 API 계약(파라미터 이름)과 일치 여부
  • SignUp/SignIn 경로: DTO 필드명 변경이 네트워크 요청에 정확히 반영되었는지

Possibly related PRs

  • #36 — 유사한 auth/user 모델 및 API 변경( role→workspace )을 포함하여 동일한 파일군을 수정합니다.
  • #25 — AuthPreferences 및 인증 DTO/매핑 관련 변경사항(워크스페이스 저장/매핑)을 다룹니다.
  • #33 — 빌드번호/버전 관련 변경(versionCode/versionName)과 중복되는 버전 업데이트를 포함합니다.

Suggested labels

ready-to-merge

Suggested reviewers

  • Lee-Jong-Jin
  • CHOOSLA
  • yangjiseonn
  • taemin3

Poem

🐰 workspace가 깡충 바뀌었네,
role은 잎새처럼 흩어지고,
암호화 속에 안전히 숨겨진 이름,
매퍼와 API가 맞춰 춤추고,
작은 당근만큼 기쁜 배포 날이에요 🥕

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 43.24% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 changeset의 주요 변경 사항을 명확하게 요약하고 있습니다. 'role' 필드를 'workspace' 필드로 광범위하게 변경한 것을 롤백하는 것이 주요 목적이며, 제목에서 이를 직관적으로 전달합니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch revert/workspace

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
app/src/main/java/com/sampoom/android/feature/auth/domain/repository/AuthRepository.kt (1)

7-14: PR 제목과 실제 변경사항의 불일치를 확인하세요.

PR 제목은 "[REVERT] Workspace, Role 통합 롤백"으로 되어 있지만, 실제 변경사항은 roleworkspace로 변경하는 것입니다. 진짜 롤백이라면 workspace를 제거하고 role을 유지해야 하는데, 현재 변경사항은 그 반대입니다.

전체 PR의 8개 파일 모두 workspace를 도입하거나 roleworkspace로 이름 변경하고 있습니다. PR의 의도를 명확히 확인하고, 제목과 구현이 일치하도록 수정해주세요.

app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt (1)

51-69: 하드코딩된 workspace 값을 제거하세요.

Line 58에서 workspace = "AGENCY"로 하드코딩되어 있습니다. 이는 심각한 문제입니다:

  • 회원가입 시 사용자가 입력한 workspace 값이 무시됩니다
  • signUpsignIn 흐름에서 불일치가 발생합니다
  • 모든 사용자가 "AGENCY" workspace로 강제 로그인됩니다

해결 방법을 선택하세요:

  1. signIn 메서드에 workspace 파라미터를 추가하여 signUp에서 전달받은 값을 사용
  2. 저장된 사용자 정보에서 workspace를 조회하여 사용
  3. 백엔드에서 이메일/비밀번호만으로 workspace를 자동 판별하는 경우, 주석으로 명확히 설명

현재 구조라면 방법 1을 추천합니다:

-    override suspend fun signIn(
-        email: String,
-        password: String
-    ): Result<User> {
+    override suspend fun signIn(
+        email: String,
+        password: String,
+        workspace: String = "AGENCY"
+    ): Result<User> {
         return runCatching {
             val loginDto = api.login(
                 LoginRequestDto(
-                    workspace = "AGENCY",
+                    workspace = workspace,
                     email = email,
                     password = password
                 )

그리고 Line 45에서 호출 시:

             retry(times = 5, initialDelay = 500) {
-                signIn(email, password).getOrThrow()
+                signIn(email, password, workspace).getOrThrow()
             }
app/src/main/java/com/sampoom/android/feature/user/domain/model/User.kt (1)

9-14: 중복된 필드: roleworkspace가 동시에 존재합니다.

User 모델에 role (Line 9)과 workspace (Line 14) 필드가 모두 존재합니다. Employee 모델과 동일한 문제입니다:

  • 어느 필드를 사용해야 할지 불명확
  • 데이터 불일치 위험
  • 코드베이스 전체에서 혼란 야기

roleworkspace가 정말 다른 개념이라면(예: role은 권한, workspace는 작업 공간), 명확한 네이밍과 문서화가 필요합니다. 같은 개념이라면 하나만 남겨야 합니다.

app/src/main/java/com/sampoom/android/feature/user/data/mapper/UserMappers.kt (1)

35-49: 빈 문자열로 초기화된 workspace

UpdateProfileResponseDto.toModel()에서 workspace = ""로 설정되어 있습니다. 프로필 업데이트 응답에서 workspace 정보를 받지 못하는 경우, 기존 사용자의 workspace 값을 유지하거나 명시적인 기본값을 사용하는 것이 더 안전합니다.

🧹 Nitpick comments (3)
app/src/main/java/com/sampoom/android/feature/user/data/mapper/UserMappers.kt (2)

51-65: role 필드에 빈 문자열 할당

EditEmployeeResponseDto.toModel()에서 role = ""로 설정하면서 동시에 workspace를 DTO에서 가져옵니다 (line 56). 이는 다음을 시사합니다:

  • Employee 도메인 모델에 여전히 role 필드가 존재
  • role이 더 이상 사용되지 않지만 제거되지 않은 상태

role 필드가 더 이상 필요하지 않다면, 도메인 모델에서 완전히 제거하는 것을 고려하세요. 사용되지 않는 필드를 빈 문자열로 유지하면 혼란과 기술 부채가 발생합니다.


67-81: 일관성 없는 필드 처리

UpdateEmployeeStatusResponseDto.toModel()에서도 동일한 패턴이 반복됩니다 - role = ""로 설정하면서 workspace는 실제 값을 사용합니다.

마이그레이션이 완료되었다면 role 필드를 도메인 모델에서 제거하는 것이 좋습니다. 그렇지 않으면 어떤 필드를 사용해야 하는지 불명확합니다.

app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt (1)

90-92: 유효성 검사 조건 가독성 개선 제안

Line 91의 조건문이 매우 길어 가독성이 떨어집니다. 여러 줄로 나누거나 중간 변수를 사용하는 것을 고려해보세요.

다음과 같이 리팩토링할 수 있습니다:

-        if (userId != null && userName != null && userEmail != null && userRole != null &&
-            accessToken != null && refreshToken != null && userPosition != null && userWorkspace != null && userBranch != null && userAgencyId != null && userStartedAt != null && userEndedAt != null
-        ) {
+        val requiredFieldsPresent = listOf(
+            userId, userName, userEmail, userRole, accessToken, refreshToken,
+            userPosition, userWorkspace, userBranch, userAgencyId, userStartedAt, userEndedAt
+        ).all { it != null }
+        
+        if (requiredFieldsPresent) {
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 742a373 and 05f4658.

📒 Files selected for processing (23)
  • app/build.gradle.kts (1 hunks)
  • app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt (4 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/data/remote/dto/LoginRequestDto.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/data/remote/dto/SignUpRequestDto.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt (3 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/domain/repository/AuthRepository.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/domain/usecase/SignUpUseCase.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiState.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/mapper/UserMappers.kt (5 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/api/UserApi.kt (3 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/EditEmployeeResponseDto.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/EmployeeDto.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/GetProfileResponseDto.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/UpdateEmployeeStatusResponseDto.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/repository/UserRepositoryImpl.kt (8 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/domain/model/Employee.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/domain/model/User.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/domain/repository/UserRepository.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/domain/usecase/EditEmployeeUseCase.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/domain/usecase/GetProfileUseCase.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/domain/usecase/UpdateEmployeeStatusUseCase.kt (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/sampoom/android/feature/user/data/repository/UserRepositoryImpl.kt (1)
app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt (1)
  • retry (7-30)
🔇 Additional comments (21)
app/build.gradle.kts (1)

35-36: 버전 범프가 일관되게 적용되었습니다.

versionCode를 7에서 8로, versionName을 "1.0.6"에서 "1.0.7"로 업데이트하는 변경사항이 일관되고 적절합니다. 의미론적 버전 관리 관례를 따르고 있으며, 패치 버전 증가가 이 정도 규모의 변경사항에 타당합니다.

다만 PR 제목의 "[REVERT]"와 AI 요약의 "role → workspace 변환"이 상충하는 것으로 보이므로, 이 PR이 실제로 workspace 통합 기능을 추가하는 것인지 아니면 이전 상태로 되돌리는 것인지 확인하시기 바랍니다. 버전 번호는 두 시나리오 모두에 적절합니다.

app/src/main/java/com/sampoom/android/feature/auth/data/remote/dto/LoginRequestDto.kt (1)

3-7: DTO 구조 변경이 올바르게 적용되었습니다.

role에서 workspace로의 필드 이름 변경이 올바르게 적용되었습니다. 다만 백엔드 API 스펙과 일치하는지 확인이 필요합니다.

app/src/main/java/com/sampoom/android/feature/auth/data/remote/dto/SignUpRequestDto.kt (1)

3-10: 회원가입 DTO 변경이 올바릅니다.

role에서 workspace로의 필드 변경이 올바르게 적용되었습니다. 백엔드 API 계약과 일치하는지 확인하세요.

app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/UpdateEmployeeStatusResponseDto.kt (1)

3-8: DTO 변경이 올바르게 적용되었습니다.

role에서 workspace로의 필드 이름 변경이 일관되게 적용되었습니다.

app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt (1)

22-48: 회원가입 로직은 올바르게 구현되었습니다.

workspace 파라미터를 받아서 SignUpRequestDto에 전달하고, 가입 후 로그인을 시도하는 흐름이 올바릅니다.

app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/GetProfileResponseDto.kt (1)

7-9: 리뷰 코멘트가 부정확합니다.

GetProfileResponseDto의 roleworkspace는 중복 필드가 아니라 서로 다른 필드입니다:

  • Line 7: val role: String
  • Line 9: val workspace: String

UserMappers.kt의 toModel() 함수에서도 두 필드 모두 명확하게 User 모델로 매핑되고 있습니다:

  • role = role
  • workspace = workspace

백엔드 API가 두 필드를 모두 반환하고 있으며, 매퍼에서도 각 필드를 적절히 처리하고 있습니다.

Likely an incorrect or invalid review comment.

app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt (1)

157-164: 변경 사항 확인 완료

workspace 파라미터 사용으로의 전환이 올바르게 적용되었습니다. SignUpUseCase 호출이 SignUpUiState의 변경사항과 일치합니다.

app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiState.kt (1)

8-8: 필드 이름 변경 확인

role에서 workspace로의 필드 이름 변경이 올바르게 적용되었습니다. 기본값 "AGENCY"가 유지되어 기존 동작과 일관성이 있습니다.

app/src/main/java/com/sampoom/android/feature/user/domain/usecase/EditEmployeeUseCase.kt (1)

10-10: 파라미터 이름 변경 적용 완료

role에서 workspace로의 파라미터 이름 변경이 repository 호출과 함께 일관되게 적용되었습니다.

app/src/main/java/com/sampoom/android/feature/user/domain/usecase/GetProfileUseCase.kt (1)

10-10: UseCase 시그니처 업데이트 확인

workspace 파라미터로의 변경이 repository 레이어와 일관되게 적용되었습니다.

app/src/main/java/com/sampoom/android/feature/auth/domain/usecase/SignUpUseCase.kt (1)

10-24: SignUp 플로우 업데이트 확인

role에서 workspace로의 파라미터 변경이 메서드 시그니처와 repository 호출 모두에 일관되게 적용되었습니다.

app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/EmployeeDto.kt (1)

9-11: roleworkspace 필드는 의도적인 설계로 중복이 아님

검증 결과, 두 필드는 서로 다른 개념을 나타냅니다:

  • role: 사용자의 역할(직책)
  • workspace: 작업 공간/조직 단위

EmployeeDto와 Employee 모델 모두에 확립되어 있으며, UserMappers.kt에서 두 필드가 모두 정상적으로 매핑되고 있습니다. 백엔드 API가 두 필드를 모두 반환하고 있으며, 모든 레이어에서 일관되게 사용 중입니다. 불완전한 마이그레이션이나 중복 필드가 아니라 의도적인 설계입니다.

app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/EditEmployeeResponseDto.kt (1)

3-8: 백엔드 API 응답 구조와의 호환성 확인 필요

DTO 필드가 role에서 workspace로 변경되었습니다. 백엔드 API가 workspace 필드를 반환하는지 확인해야 합니다. 백엔드가 아직 업데이트되지 않았다면 런타임에 역직렬화 오류가 발생할 수 있습니다.

app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt (1)

36-36: workspace 필드 저장 및 로드 로직 추가 완료

USER_WORKSPACE 키를 추가하고 암호화/복호화 로직이 올바르게 구현되었습니다. role 필드와 별도로 workspace 필드가 저장되며, User 객체 생성 시 두 필드가 모두 포함됩니다.

Also applies to: 55-55, 84-84, 91-91, 109-109

app/src/main/java/com/sampoom/android/feature/user/data/repository/UserRepositoryImpl.kt (4)

31-63: getProfile 메서드 workspace 파라미터 업데이트 완료

메서드가 workspace 파라미터를 받아 API에 전달하고, 응답에서 workspace 필드를 User 객체에 올바르게 매핑합니다. role 필드도 함께 유지되므로 User 모델이 두 필드를 모두 가지고 있는 것으로 보입니다.


107-141: editEmployee 메서드 workspace 파라미터 업데이트 완료

Line 128의 fallback 로직(takeIf { it.isNotBlank() })은 DTO에서 빈 문자열이 반환될 경우를 대비한 방어 코드입니다. Line 126에서 employee.role이 여전히 사용되는 것으로 보아 Employee 모델에 roleworkspace 필드가 모두 존재하는 것으로 확인됩니다.


144-178: updateEmployeeStatus 메서드 workspace 파라미터 업데이트 완료

Line 165의 fallback 로직이 일관되게 적용되었으며, Line 163에서 role 필드도 함께 유지됩니다. 구현이 올바릅니다.


181-197: getEmployeeCount에서 workspace 사용으로 변경 완료

Line 184에서 저장된 사용자로부터 workspace를 읽어 API 호출에 사용합니다. 이전에는 role을 사용했을 것으로 추정되며, 백엔드 API가 이 변경사항을 지원하는지 확인이 필요합니다.

app/src/main/java/com/sampoom/android/feature/user/domain/usecase/UpdateEmployeeStatusUseCase.kt (1)

10-10: 파라미터 변경사항이 모든 호출부에 정상 적용됨

검증 결과, UpdateEmployeeStatusUseCase의 호출은 UpdateEmployeeStatusViewModel.kt 한 곳에만 존재하며, 해당 위치에서 workspace 파라미터를 올바르게 전달하고 있습니다. 기존 "role" 파라미터를 사용하는 호출부는 발견되지 않았습니다.

  • 호출 위치: UpdateEmployeeStatusViewModel.kt:73
  • 호출 형태: updateEmployeeStatusUseCase(updateEmployee, "AGENCY")
  • 결과: ✓ workspace 파라미터 정상 사용
app/src/main/java/com/sampoom/android/feature/user/domain/repository/UserRepository.kt (1)

10-14: 검토 의견이 코드 상황과 일치하지 않습니다

현재 코드를 확인한 결과:

  1. 메서드 시그니처에 role 파라미터 없음: role은 도메인 모델(User, Employee)의 필드이지, 메서드 파라미터가 아닙니다. UserRepository 인터페이스의 메서드들은 role을 파라미터로 받지 않습니다.

  2. 모든 구현체 및 호출부가 올바르게 업데이트됨:

    • GetProfileUseCase, EditEmployeeUseCase, UpdateEmployeeStatusUseCase에서 workspace 파라미터를 올바르게 전달
    • UserRepositoryImpl이 인터페이스를 정확히 구현하고 있음
    • 역호환성 문제 없음

Likely an incorrect or invalid review comment.

app/src/main/java/com/sampoom/android/feature/user/data/remote/api/UserApi.kt (1)

21-21: 백엔드 API 호환성 확인 필수

검증 결과, 리뷰 의견이 정확합니다. Git 이력에서 @Query("role")에서 @Query("workspace")로의 변경이 확실하며, 다음 4개 엔드포인트가 모두 영향을 받습니다:

  • getProfile() (21줄)
  • editEmployee() (31줄)
  • getEmployeeList() (38줄)
  • updateEmployeeStatus() (48줄)

코드베이스 전체에서 도메인 모델, 저장소 계층, 유스케이스가 일관되게 workspace 파라미터를 사용하고 있으나, 백엔드가 이 파라미터 이름을 실제로 지원하는지 확인할 수 있는 API 문서나 테스트가 저장소에 없습니다.

Git 커밋 이력(05f4658 [REVERT] Workspace, Role 통합 롤백, 3d150ff [REFAC] User Workspace 삭제 Role 통합)에서 이 파라미터가 여러 번 변경된 것으로 보아, 백엔드 팀과의 조율이 필요합니다.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
app/src/main/java/com/sampoom/android/feature/auth/ui/AuthViewModel.kt (1)

22-22: 사용되지 않는 의존성 주입

signOutUseCase가 주입되지만 실제로 사용되지 않습니다 (53번 라인에서 주석 처리됨).

  • 만약 이 use case가 더 이상 필요하지 않다면 생성자에서 제거하세요
  • 만약 임시로 비활성화한 것이라면, 가능한 빨리 정상적으로 호출되도록 수정해야 합니다

53번 라인의 주석을 해제하지 않을 경우, 다음 diff를 적용하여 사용하지 않는 의존성을 제거하세요:

 @HiltViewModel
 class AuthViewModel @Inject constructor(
     private val checkLoginStateUseCase: CheckLoginStateUseCase,
-    private val signOutUseCase: SignOutUseCase,
     private val clearTokensUseCase: ClearTokensUseCase,
     tokenLogoutEmitter: TokenLogoutEmitter
 ) : ViewModel() {
🧹 Nitpick comments (1)
app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt (1)

87-89: 검증 로직 가독성 개선을 고려해주세요.

13개의 필드를 검증하는 조건문이 2줄에 걸쳐 작성되어 있어 가독성이 떨어집니다. 유지보수성 향상을 위해 리팩토링을 고려해볼 수 있습니다.

예시:

val requiredFields = listOf(
    userId, userName, userEmail, accessToken, refreshToken, 
    userPosition, userWorkspace, userBranch, userAgencyId, 
    userStartedAt, userEndedAt
)

if (requiredFields.all { it != null }) {
    // ... User 생성 로직
}
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 05f4658 and f8ae1ee.

📒 Files selected for processing (12)
  • app/build.gradle.kts (1 hunks)
  • app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt (4 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt (4 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/ui/AuthViewModel.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/mapper/UserMappers.kt (5 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/EditEmployeeResponseDto.kt (0 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/EmployeeDto.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/UpdateEmployeeStatusResponseDto.kt (0 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/data/repository/UserRepositoryImpl.kt (8 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/domain/model/Employee.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/user/domain/model/User.kt (1 hunks)
💤 Files with no reviewable changes (2)
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/EditEmployeeResponseDto.kt
  • app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/UpdateEmployeeStatusResponseDto.kt
🚧 Files skipped from review as they are similar to previous changes (4)
  • app/src/main/java/com/sampoom/android/feature/user/domain/model/Employee.kt
  • app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt
  • app/build.gradle.kts
  • app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/sampoom/android/feature/user/data/repository/UserRepositoryImpl.kt (1)
app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt (1)
  • retry (7-30)
🔇 Additional comments (20)
app/src/main/java/com/sampoom/android/feature/user/domain/model/User.kt (1)

13-13: 필드 변경이 올바르게 적용되었습니다.

role에서 workspace로의 필드 변경이 올바르게 적용되었습니다.

app/src/main/java/com/sampoom/android/feature/user/data/remote/dto/EmployeeDto.kt (1)

10-10: DTO 필드 변경이 적절합니다.

도메인 모델과 일관되게 workspace 필드가 추가되었습니다.

app/src/main/java/com/sampoom/android/feature/user/data/mapper/UserMappers.kt (5)

21-21: GetProfile 매핑이 올바르게 구현되었습니다.

DTO의 workspace 필드를 도메인 모델로 정확히 매핑하고 있습니다.


68-68: 직원 상태 업데이트 응답의 workspace 처리가 적절합니다.

빈 문자열 기본값을 사용하고 있으며, UserRepositoryImpl 161번째 줄의 fallback 로직으로 안전하게 처리됩니다.


83-83: EmployeeDto 매핑이 올바릅니다.

DTO의 workspace 필드를 직접 전달하여 정확하게 매핑하고 있습니다.


42-42: workspace 기본값 설정은 올바릅니다.

검증 결과, UpdateProfileResponseDto에는 실제로 workspace 필드가 없으며, 매퍼에서 workspace = ""로 기본값을 설정하는 것은 의도된 동작입니다. API 응답에 workspace 데이터가 포함되지 않을 때 도메인 모델에 필요한 필드에 대한 기본값을 제공하는 것이 적절한 처리이며, 이는 EditEmployeeResponseDtoUpdateEmployeeStatusResponseDto 매핑에서도 동일하게 적용되는 일관된 패턴입니다.


53-53: 작동 의도 확인됨 - 코드 승인

검증 결과, 이 구현은 설계상 의도된 것으로 확인됩니다:

  • EditEmployeeResponseDto는 API 응답에서 수정 가능한 필드(userId, userName, position)만 포함하도록 설계됨
  • workspace는 API 응답에 포함되지 않는 것이 맞음 (수정 불가능한 필드)
  • UserMappers.kt 53줄의 빈 문자열 초기화는 정상적인 동작
  • UserRepositoryImpl 125줄의 fallback 로직이 기존 workspace 값을 올바르게 보존함

코드 변경사항에 문제가 없습니다.

app/src/main/java/com/sampoom/android/feature/user/data/repository/UserRepositoryImpl.kt (8)

31-34: getProfile 메서드 시그니처 변경이 적절합니다.

workspace 파라미터를 받아 API 호출에 전달하도록 올바르게 수정되었습니다.


48-48: User 객체 생성 시 workspace 매핑이 정확합니다.

프로필 응답에서 받은 workspace 값을 User 객체에 올바르게 할당하고 있습니다.


83-83: 프로필 업데이트 시 workspace 보존이 적절합니다.

입력으로 받은 User의 workspace 값을 업데이트된 User 객체에 전파하고 있습니다.


105-116: editEmployee 메서드의 workspace 처리가 올바릅니다.

메서드 시그니처에 workspace 파라미터를 추가하고, API 호출 시 정확히 전달하고 있습니다.


125-125: workspace fallback 로직이 안전하게 구현되었습니다.

API 응답에서 workspace가 비어있을 경우 기존 직원의 workspace 값을 유지하는 방어적 코딩이 적용되어 있습니다.


141-152: updateEmployeeStatus의 workspace 파라미터 전달이 정확합니다.

상태 업데이트 메서드에도 workspace가 일관되게 적용되었습니다.


161-161: 상태 업데이트 시 workspace fallback 처리가 적절합니다.

직원 수정과 동일한 패턴으로 안전하게 workspace를 처리하고 있습니다.


177-184: getEmployeeCount에서 workspace 사용이 올바릅니다.

저장된 사용자로부터 workspace를 읽어 API 호출에 전달하는 로직이 정확합니다.

app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt (5)

35-35: workspace 키 추가가 적절합니다.

다른 사용자 필드와 일관된 방식으로 USER_WORKSPACE 키가 정의되었습니다.


53-53: workspace 암호화 저장이 올바르게 구현되었습니다.

사용자의 workspace 값을 암호화하여 안전하게 저장하고 있습니다.


81-81: workspace 읽기 로직이 정확합니다.

저장된 암호화된 workspace 값을 올바르게 읽어오고 있습니다.


103-108: UserPosition 안전한 파싱이 잘 구현되었습니다.

잘못된 position 값에 대한 예외 처리를 추가하여 STAFF로 fallback하는 방어적 코딩이 적용되었습니다. 이는 데이터 무결성을 보장하는 좋은 개선사항입니다.


109-109: workspace 복호화 및 User 생성이 정확합니다.

암호화된 workspace를 복호화하여 User 객체 생성에 올바르게 사용하고 있습니다.

Copy link

@taemin3 taemin3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다

@Sangyoon98 Sangyoon98 merged commit 4895f7f into main Nov 11, 2025
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants